package com.itcam.cm.manager.service.impl;

import cn.hutool.captcha.CaptchaUtil;
import cn.hutool.captcha.CircleCaptcha;
import com.itcam.cm.manager.service.ValidateCodeService;
import com.itcam.cm.model.vo.system.ValidateCodeVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.UUID;
import java.util.concurrent.TimeUnit;

@Service
public class ValidateCodeServiceImpl implements ValidateCodeService {

    @Autowired
    RedisTemplate<String, String> redisTemplate;

    /**
     * 生成验证码的接口方法
     * 此方法会生成一个图片验证码，并将其存储到 Redis 中，最后返回包含验证码信息的视图对象
     * @return 包含验证码信息的 ValidateCodeVo 对象
     */
    @Override
    public ValidateCodeVo generateValidateCode() {
        // 使用 hutool 工具包的工具类生成图片验证码
        // 参数分别为：验证码图片的宽度 150 像素，高度 48 像素，验证码字符数量为 4 个，干扰线数量为 20 条
        CircleCaptcha circleCaptcha = CaptchaUtil.createCircleCaptcha(150, 48, 4, 20);
        // 获取生成的验证码字符串
        String codeValue = circleCaptcha.getCode();
        // 获取验证码图片的 Base64 编码字符串
        String imageBase64 = circleCaptcha.getImageBase64();

        // 生成 uuid 作为图片验证码的唯一标识
        // 并将 uuid 中的连字符 "-" 替换为空字符串，使标识更简洁
        String codeKey = UUID.randomUUID().toString().replace("-", "");

        // 将验证码存储到 Redis 中
        // 键为 "user:login:validatecode:" 加上生成的唯一标识
        // 值为验证码字符串
        // 过期时间为 5 分钟
        redisTemplate.opsForValue().set("user:login:validatecode:" + codeKey, codeValue, 5, TimeUnit.MINUTES);

        // 构造响应结果数据
        ValidateCodeVo validateCodeVo = new ValidateCodeVo();
        // 设置验证码的唯一标识
        validateCodeVo.setCodeKey(codeKey);
        // 设置验证码图片的 Base64 编码字符串，并添加图片类型前缀
        validateCodeVo.setCodeValue("data:image/png;base64," + imageBase64);

        // 返回包含验证码信息的视图对象
        return validateCodeVo;
    }

}
